﻿//using Microsoft.AspNetCore.Mvc;
//using Microsoft.AspNetCore.Mvc.Filters;
//using RuoVea.Tool;
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Linq;
//using System.Reflection;
//using System.Text;
//using System.Threading.Tasks;

//namespace RuoVea.Application
//{
//    public class DesensitizationAttribute : Attribute, IActionFilter
//    {
//        public string[][] Desensitizations { get; set; }
//        public DesensitizationAttribute(params string[] desensitizations)
//        {
//            Desensitizations = new string[desensitizations.Length][];
//            for (int i = 0; i < desensitizations.Length; i++)
//            {
//                desensitizations[i] = desensitizations[i].Replace("，", ",");
//                string[] str = desensitizations[i].Split(',');
//                switch (str.Count())
//                {
//                    case 1:
//                        Desensitizations[i] = new string[4] { str[0].Trim(), "4", "4", "*" };
//                        break;
//                    case 3:
//                        Desensitizations[i] = new string[4] { str[0].Trim(), str[1].Trim(), str[2].Trim(), "*" };
//                        break;
//                    case 4:
//                        Desensitizations[i] = new string[4] { str[0].Trim(), str[1].Trim(), str[2].Trim(), str[3].Trim() };
//                        break;
//                    default:
//                        break;
//                }
//            }
//        }

//        public void OnActionExecuting(ActionExecutingContext context)
//        {

//        }

//        public void OnActionExecuted(ActionExecutedContext context)
//        {
//            if (context.Result != null && context.Result is ObjectResult)
//            {
//                ObjectResult obj = context.Result as ObjectResult;

//                GetInfoPropertys(obj.Value);
//                context.Result = obj;
//            }
//        }

//        /// <summary>
//        /// 反射的方式递归脱敏
//        /// </summary>
//        /// <param name="obj">需要脱敏的对象</param>
//        public void GetInfoPropertys(object obj)
//        {
//            if (obj == null) return;
//            Type type = obj.GetType();
//            if (type.IsGenericType)
//            {
//                //如果是List，需要遍历
//                if (obj is ICollection Ilist)
//                {
//                    foreach (object o in Ilist)
//                    {
//                        GetInfoPropertys(o);
//                    }
//                }
//                return;
//            }
//            foreach (PropertyInfo property in type.GetProperties())
//            {
//                object value = property.GetValue(obj, null);
//                if (property.PropertyType.IsValueType || property.PropertyType.Name.StartsWith("String"))
//                {
//                    string[] str = Desensitizations.FirstOrDefault(t => t[0] == property.Name);
//                    if (str != null)
//                    {
//                        string result = value == null ? "" : value.ToString().ReplaceWithSpecialChar(Convert.ToInt32(str[1]), Convert.ToInt32(str[2]), Convert.ToChar(str[3]));
//                        property.SetValue(obj, result, null);
//                    }
//                }
//                else
//                {
//                    GetInfoPropertys(value);
//                }
//            }
//        }
//    }
//}
